pownode refactor

This commit is contained in:
fosse 2023-09-07 11:34:22 -04:00
parent 3882a452fc
commit bb397cd3ee
15 changed files with 187 additions and 185 deletions

View file

@ -1,159 +1,159 @@
import 'dart:io'; // import 'dart:io';
import 'package:cw_core/keyable.dart'; // import 'package:cw_core/keyable.dart';
import 'dart:convert'; // import 'dart:convert';
import 'package:http/http.dart' as http; // import 'package:http/http.dart' as http;
import 'package:hive/hive.dart'; // import 'package:hive/hive.dart';
import 'package:cw_core/hive_type_ids.dart'; // import 'package:cw_core/hive_type_ids.dart';
import 'package:cw_core/wallet_type.dart'; // import 'package:cw_core/wallet_type.dart';
import 'package:http/io_client.dart' as ioc; // import 'package:http/io_client.dart' as ioc;
part 'pow_node.g.dart'; // part 'pow_node.g.dart';
Uri createUriFromElectrumAddress(String address) => Uri.tryParse('tcp://$address')!; // Uri createUriFromElectrumAddress(String address) => Uri.tryParse('tcp://$address')!;
@HiveType(typeId: PowNode.typeId) // @HiveType(typeId: PowNode.typeId)
class PowNode extends HiveObject with Keyable { // class PowNode extends HiveObject with Keyable {
PowNode({ // PowNode({
this.login, // this.login,
this.password, // this.password,
this.useSSL, // this.useSSL,
this.trusted = false, // this.trusted = false,
this.socksProxyAddress, // this.socksProxyAddress,
String? uri, // String? uri,
WalletType? type, // WalletType? type,
}) { // }) {
if (uri != null) { // if (uri != null) {
uriRaw = uri; // uriRaw = uri;
} // }
if (type != null) { // if (type != null) {
this.type = type; // this.type = type;
} // }
} // }
PowNode.fromMap(Map<String, Object?> map) // PowNode.fromMap(Map<String, Object?> map)
: uriRaw = map['uri'] as String? ?? '', // : uriRaw = map['uri'] as String? ?? '',
login = map['login'] as String?, // login = map['login'] as String?,
password = map['password'] as String?, // password = map['password'] as String?,
useSSL = map['useSSL'] as bool?, // useSSL = map['useSSL'] as bool?,
trusted = map['trusted'] as bool? ?? false, // trusted = map['trusted'] as bool? ?? false,
socksProxyAddress = map['socksProxyPort'] as String?; // socksProxyAddress = map['socksProxyPort'] as String?;
static const typeId = POW_NODE_TYPE_ID; // static const typeId = POW_NODE_TYPE_ID;
static const boxName = 'PowNodes'; // static const boxName = 'PowNodes';
@HiveField(0, defaultValue: '') // @HiveField(0, defaultValue: '')
late String uriRaw; // late String uriRaw;
@HiveField(1) // @HiveField(1)
String? login; // String? login;
@HiveField(2) // @HiveField(2)
String? password; // String? password;
@HiveField(3, defaultValue: 0) // @HiveField(3, defaultValue: 0)
late int typeRaw; // late int typeRaw;
@HiveField(4) // @HiveField(4)
bool? useSSL; // bool? useSSL;
@HiveField(5, defaultValue: false) // @HiveField(5, defaultValue: false)
bool trusted; // bool trusted;
@HiveField(6) // @HiveField(6)
String? socksProxyAddress; // String? socksProxyAddress;
bool get isSSL => useSSL ?? false; // bool get isSSL => useSSL ?? false;
bool get useSocksProxy => socksProxyAddress == null ? false : socksProxyAddress!.isNotEmpty; // bool get useSocksProxy => socksProxyAddress == null ? false : socksProxyAddress!.isNotEmpty;
Uri get uri { // Uri get uri {
switch (type) { // switch (type) {
case WalletType.monero: // case WalletType.monero:
return Uri.http(uriRaw, ''); // return Uri.http(uriRaw, '');
case WalletType.bitcoin: // case WalletType.bitcoin:
return createUriFromElectrumAddress(uriRaw); // return createUriFromElectrumAddress(uriRaw);
case WalletType.litecoin: // case WalletType.litecoin:
return createUriFromElectrumAddress(uriRaw); // return createUriFromElectrumAddress(uriRaw);
case WalletType.haven: // case WalletType.haven:
return Uri.http(uriRaw, ''); // return Uri.http(uriRaw, '');
case WalletType.ethereum: // case WalletType.ethereum:
return Uri.https(uriRaw, ''); // return Uri.https(uriRaw, '');
case WalletType.nano: // case WalletType.nano:
case WalletType.banano: // case WalletType.banano:
if (uriRaw.contains("https") || uriRaw.endsWith("443") || isSSL) { // if (uriRaw.contains("https") || uriRaw.endsWith("443") || isSSL) {
return Uri.https(uriRaw, ''); // return Uri.https(uriRaw, '');
} else { // } else {
return Uri.http(uriRaw, ''); // return Uri.http(uriRaw, '');
} // }
default: // default:
throw Exception('Unexpected type ${type.toString()} for Node uri'); // throw Exception('Unexpected type ${type.toString()} for Node uri');
} // }
} // }
@override // @override
bool operator ==(other) => // bool operator ==(other) =>
other is PowNode && // other is PowNode &&
(other.uriRaw == uriRaw && // (other.uriRaw == uriRaw &&
other.login == login && // other.login == login &&
other.password == password && // other.password == password &&
other.typeRaw == typeRaw && // other.typeRaw == typeRaw &&
other.useSSL == useSSL && // other.useSSL == useSSL &&
other.trusted == trusted && // other.trusted == trusted &&
other.socksProxyAddress == socksProxyAddress); // other.socksProxyAddress == socksProxyAddress);
@override // @override
int get hashCode => // int get hashCode =>
uriRaw.hashCode ^ // uriRaw.hashCode ^
login.hashCode ^ // login.hashCode ^
password.hashCode ^ // password.hashCode ^
typeRaw.hashCode ^ // typeRaw.hashCode ^
useSSL.hashCode ^ // useSSL.hashCode ^
trusted.hashCode ^ // trusted.hashCode ^
socksProxyAddress.hashCode; // socksProxyAddress.hashCode;
@override // @override
dynamic get keyIndex { // dynamic get keyIndex {
_keyIndex ??= key; // _keyIndex ??= key;
return _keyIndex; // return _keyIndex;
} // }
WalletType get type => deserializeFromInt(typeRaw); // WalletType get type => deserializeFromInt(typeRaw);
set type(WalletType type) => typeRaw = serializeToInt(type); // set type(WalletType type) => typeRaw = serializeToInt(type);
dynamic _keyIndex; // dynamic _keyIndex;
Future<bool> requestNode() async { // Future<bool> requestNode() async {
try { // try {
switch (type) { // switch (type) {
case WalletType.nano: // case WalletType.nano:
return requestNanoPowNode(); // return requestNanoPowNode();
default: // default:
return false; // return false;
} // }
} catch (_) { // } catch (_) {
return false; // return false;
} // }
} // }
Future<bool> requestNanoPowNode() async { // Future<bool> requestNanoPowNode() async {
return http // return http
.post( // .post(
uri, // uri,
headers: {'Content-type': 'application/json'}, // headers: {'Content-type': 'application/json'},
body: json.encode( // body: json.encode(
{ // {
"action": "work_generate", // "action": "work_generate",
"hash": "0000000000000000000000000000000000000000000000000000000000000000", // "hash": "0000000000000000000000000000000000000000000000000000000000000000",
}, // },
), // ),
) // )
.then((http.Response response) { // .then((http.Response response) {
if (response.statusCode == 200) { // if (response.statusCode == 200) {
return true; // return true;
} else { // } else {
return false; // return false;
} // }
}); // });
} // }
} // }

View file

@ -60,7 +60,7 @@ abstract class WalletBase<
Future<void> connectToNode({required Node node}); Future<void> connectToNode({required Node node});
// there is a default definition here because only coins with a pow node (nano based) need to override this // there is a default definition here because only coins with a pow node (nano based) need to override this
Future<void> connectToPowNode({required PowNode node}) async {} Future<void> connectToPowNode({required Node node}) async {}
Future<void> startSync(); Future<void> startSync();

View file

@ -18,7 +18,7 @@ class NanoClient {
"nano_38713x95zyjsqzx6nm1dsom1jmm668owkeb9913ax6nfgj15az3nu8xkx579"; "nano_38713x95zyjsqzx6nm1dsom1jmm668owkeb9913ax6nfgj15az3nu8xkx579";
Node? _node; Node? _node;
PowNode? _powNode; Node? _powNode;
bool connect(Node node) { bool connect(Node node) {
try { try {
@ -29,7 +29,7 @@ class NanoClient {
} }
} }
bool connectPow(PowNode node) { bool connectPow(Node node) {
try { try {
_powNode = node; _powNode = node;
return true; return true;

View file

@ -151,7 +151,7 @@ abstract class NanoWalletBase
} }
@override @override
Future<void> connectToPowNode({required PowNode node}) async { Future<void> connectToPowNode({required Node node}) async {
_client.connectPow(node); _client.connectPow(node);
} }

View file

@ -226,7 +226,7 @@ final getIt = GetIt.instance;
var _isSetupFinished = false; var _isSetupFinished = false;
late Box<WalletInfo> _walletInfoSource; late Box<WalletInfo> _walletInfoSource;
late Box<Node> _nodeSource; late Box<Node> _nodeSource;
late Box<PowNode> _powNodeSource; late Box<Node> _powNodeSource;
late Box<Contact> _contactSource; late Box<Contact> _contactSource;
late Box<Trade> _tradesSource; late Box<Trade> _tradesSource;
late Box<Template> _templates; late Box<Template> _templates;
@ -239,7 +239,7 @@ late Box<AnonpayInvoiceInfo> _anonpayInvoiceInfoSource;
Future<void> setup({ Future<void> setup({
required Box<WalletInfo> walletInfoSource, required Box<WalletInfo> walletInfoSource,
required Box<Node> nodeSource, required Box<Node> nodeSource,
required Box<PowNode> powNodeSource, required Box<Node> powNodeSource,
required Box<Contact> contactSource, required Box<Contact> contactSource,
required Box<Trade> tradesSource, required Box<Trade> tradesSource,
required Box<Template> templates, required Box<Template> templates,
@ -287,7 +287,7 @@ Future<void> setup({
} }
getIt.registerFactory<Box<Node>>(() => _nodeSource); getIt.registerFactory<Box<Node>>(() => _nodeSource);
getIt.registerFactory<Box<PowNode>>(() => _powNodeSource); getIt.registerFactory<Box<Node>>(() => _powNodeSource, instanceName: Node.boxName + "pow");
getIt.registerSingleton<FlutterSecureStorage>(FlutterSecureStorage()); getIt.registerSingleton<FlutterSecureStorage>(FlutterSecureStorage());
getIt.registerSingleton(AuthenticationStore()); getIt.registerSingleton(AuthenticationStore());
@ -756,8 +756,8 @@ Future<void> setup({
editingNode: editingNode, editingNode: editingNode,
isSelected: isSelected)); isSelected: isSelected));
getIt.registerFactoryParam<PowNodeCreateOrEditPage, PowNode?, bool?>( getIt.registerFactoryParam<PowNodeCreateOrEditPage, Node?, bool?>(
(PowNode? editingNode, bool? isSelected) => PowNodeCreateOrEditPage( (Node? editingNode, bool? isSelected) => PowNodeCreateOrEditPage(
nodeCreateOrEditViewModel: getIt.get<PowNodeCreateOrEditViewModel>(), nodeCreateOrEditViewModel: getIt.get<PowNodeCreateOrEditViewModel>(),
editingNode: editingNode, editingNode: editingNode,
isSelected: isSelected)); isSelected: isSelected));

View file

@ -36,7 +36,7 @@ Future<void> defaultSettingsMigration(
required SharedPreferences sharedPreferences, required SharedPreferences sharedPreferences,
required FlutterSecureStorage secureStorage, required FlutterSecureStorage secureStorage,
required Box<Node> nodes, required Box<Node> nodes,
required Box<PowNode> powNodes, required Box<Node> powNodes,
required Box<WalletInfo> walletInfoSource, required Box<WalletInfo> walletInfoSource,
required Box<Trade> tradeSource, required Box<Trade> tradeSource,
required Box<Contact> contactSource}) async { required Box<Contact> contactSource}) async {
@ -320,8 +320,8 @@ Node? getNanoDefaultNode({required Box<Node> nodes}) {
nodes.values.firstWhereOrNull((node) => node.type == WalletType.nano); nodes.values.firstWhereOrNull((node) => node.type == WalletType.nano);
} }
PowNode? getNanoDefaultPowNode({required Box<PowNode> nodes}) { Node? getNanoDefaultPowNode({required Box<Node> nodes}) {
return nodes.values.firstWhereOrNull((PowNode node) => node.uriRaw == nanoDefaultPowNodeUri) ?? return nodes.values.firstWhereOrNull((Node node) => node.uriRaw == nanoDefaultPowNodeUri) ??
nodes.values.firstWhereOrNull((node) => (node.type == WalletType.nano)); nodes.values.firstWhereOrNull((node) => (node.type == WalletType.nano));
} }
@ -495,7 +495,7 @@ Future<void> changeDefaultMoneroNode(
} }
Future<void> checkCurrentNodes( Future<void> checkCurrentNodes(
Box<Node> nodeSource, Box<PowNode> powNodeSource, SharedPreferences sharedPreferences) async { Box<Node> nodeSource, Box<Node> powNodeSource, SharedPreferences sharedPreferences) async {
final currentMoneroNodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey); final currentMoneroNodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
final currentBitcoinElectrumSeverId = final currentBitcoinElectrumSeverId =
sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey); sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey);
@ -559,10 +559,10 @@ Future<void> checkCurrentNodes(
} }
if (currentNanoPowNodeServer == null) { if (currentNanoPowNodeServer == null) {
PowNode? node = powNodeSource.values Node? node = powNodeSource.values
.firstWhereOrNull((node) => node.uri.toString() == nanoDefaultPowNodeUri); .firstWhereOrNull((node) => node.uri.toString() == nanoDefaultPowNodeUri);
if (node == null) { if (node == null) {
node = PowNode(uri: nanoDefaultPowNodeUri, type: WalletType.nano); node = Node(uri: nanoDefaultPowNodeUri, type: WalletType.nano);
await powNodeSource.add(node); await powNodeSource.add(node);
} }
await sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, node.key as int); await sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, node.key as int);
@ -647,7 +647,7 @@ Future<void> changeNanoCurrentNodeToDefault(
} }
Future<void> changeNanoCurrentPowNodeToDefault( Future<void> changeNanoCurrentPowNodeToDefault(
{required SharedPreferences sharedPreferences, required Box<PowNode> nodes}) async { {required SharedPreferences sharedPreferences, required Box<Node> nodes}) async {
final node = getNanoDefaultPowNode(nodes: nodes); final node = getNanoDefaultPowNode(nodes: nodes);
final nodeId = node?.key as int? ?? 0; final nodeId = node?.key as int? ?? 0;
await sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, nodeId); await sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, nodeId);

View file

@ -101,14 +101,14 @@ Future<List<Node>> loadDefaultNanoNodes() async {
return nodes; return nodes;
} }
Future<List<PowNode>> loadDefaultNanoPowNodes() async { Future<List<Node>> loadDefaultNanoPowNodes() async {
final powNodesRaw = await rootBundle.loadString('assets/nano_pow_node_list.yml'); final powNodesRaw = await rootBundle.loadString('assets/nano_pow_node_list.yml');
final loadedPowNodes = loadYaml(powNodesRaw) as YamlList; final loadedPowNodes = loadYaml(powNodesRaw) as YamlList;
final nodes = <PowNode>[]; final nodes = <Node>[];
for (final raw in loadedPowNodes) { for (final raw in loadedPowNodes) {
if (raw is Map) { if (raw is Map) {
final node = PowNode.fromMap(Map<String, Object>.from(raw)); final node = Node.fromMap(Map<String, Object>.from(raw));
node.type = WalletType.nano; node.type = WalletType.nano;
nodes.add(node); nodes.add(node);
} }
@ -136,7 +136,7 @@ Future resetToDefault(Box<Node> nodeSource) async {
await nodeSource.addAll(nodes); await nodeSource.addAll(nodes);
} }
Future resetPowToDefault(Box<PowNode> powNodeSource) async { Future resetPowToDefault(Box<Node> powNodeSource) async {
final nanoPowNodes = await loadDefaultNanoPowNodes(); final nanoPowNodes = await loadDefaultNanoPowNodes();
final nodes = nanoPowNodes; final nodes = nanoPowNodes;
await powNodeSource.clear(); await powNodeSource.clear();

View file

@ -83,9 +83,9 @@ Future<void> initializeAppConfigs() async {
CakeHive.registerAdapter(NodeAdapter()); CakeHive.registerAdapter(NodeAdapter());
} }
if (!CakeHive.isAdapterRegistered(PowNode.typeId)) { // if (!CakeHive.isAdapterRegistered(PowNode.typeId)) {
CakeHive.registerAdapter(PowNodeAdapter()); // CakeHive.registerAdapter(PowNodeAdapter());
} // }
if (!CakeHive.isAdapterRegistered(TransactionDescription.typeId)) { if (!CakeHive.isAdapterRegistered(TransactionDescription.typeId)) {
CakeHive.registerAdapter(TransactionDescriptionAdapter()); CakeHive.registerAdapter(TransactionDescriptionAdapter());
@ -138,7 +138,7 @@ Future<void> initializeAppConfigs() async {
final ordersBoxKey = await getEncryptionKey(secureStorage: secureStorage, forKey: Order.boxKey); final ordersBoxKey = await getEncryptionKey(secureStorage: secureStorage, forKey: Order.boxKey);
final contacts = await CakeHive.openBox<Contact>(Contact.boxName); final contacts = await CakeHive.openBox<Contact>(Contact.boxName);
final nodes = await CakeHive.openBox<Node>(Node.boxName); final nodes = await CakeHive.openBox<Node>(Node.boxName);
final powNodes = await CakeHive.openBox<PowNode>(PowNode.boxName); final powNodes = await CakeHive.openBox<Node>(Node.boxName + "pow");// must be different from Node.boxName
final transactionDescriptions = await CakeHive.openBox<TransactionDescription>( final transactionDescriptions = await CakeHive.openBox<TransactionDescription>(
TransactionDescription.boxName, TransactionDescription.boxName,
encryptionKey: transactionDescriptionsBoxKey); encryptionKey: transactionDescriptionsBoxKey);
@ -171,7 +171,7 @@ Future<void> initializeAppConfigs() async {
Future<void> initialSetup( Future<void> initialSetup(
{required SharedPreferences sharedPreferences, {required SharedPreferences sharedPreferences,
required Box<Node> nodes, required Box<Node> nodes,
required Box<PowNode> powNodes, required Box<Node> powNodes,
required Box<WalletInfo> walletInfoSource, required Box<WalletInfo> walletInfoSource,
required Box<Contact> contactSource, required Box<Contact> contactSource,
required Box<Trade> tradesSource, required Box<Trade> tradesSource,

View file

@ -335,7 +335,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
final args = settings.arguments as Map<String, dynamic>?; final args = settings.arguments as Map<String, dynamic>?;
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (_) => getIt.get<PowNodeCreateOrEditPage>( builder: (_) => getIt.get<PowNodeCreateOrEditPage>(
param1: args?['editingNode'] as PowNode?, param2: args?['isSelected'] as bool?)); param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?));
case Routes.accountCreation: case Routes.accountCreation:
return CupertinoPageRoute<String>( return CupertinoPageRoute<String>(

View file

@ -83,7 +83,7 @@ class PowNodeCreateOrEditPage extends BasePage {
); );
final PowNodeCreateOrEditViewModel nodeCreateOrEditViewModel; final PowNodeCreateOrEditViewModel nodeCreateOrEditViewModel;
final PowNode? editingNode; final Node? editingNode;
final bool? isSelected; final bool? isSelected;
@override @override

View file

@ -5,6 +5,7 @@ import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/node_list/pow_node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/node_list/pow_node_create_or_edit_view_model.dart';
import 'package:cw_core/node.dart';
import 'package:cw_core/pow_node.dart'; import 'package:cw_core/pow_node.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
@ -66,7 +67,7 @@ class PowNodeForm extends StatelessWidget {
final PowNodeCreateOrEditViewModel nodeViewModel; final PowNodeCreateOrEditViewModel nodeViewModel;
final GlobalKey<FormState> formKey; final GlobalKey<FormState> formKey;
final PowNode? editingNode; final Node? editingNode;
final TextEditingController _addressController; final TextEditingController _addressController;
final TextEditingController _portController; final TextEditingController _portController;

View file

@ -3,6 +3,7 @@ import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart';
import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart';
import 'package:cake_wallet/themes/extensions/filter_theme.dart'; import 'package:cake_wallet/themes/extensions/filter_theme.dart';
import 'package:cake_wallet/themes/extensions/receive_page_theme.dart'; import 'package:cake_wallet/themes/extensions/receive_page_theme.dart';
import 'package:cw_core/node.dart';
import 'package:cw_core/pow_node.dart'; import 'package:cw_core/pow_node.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -14,7 +15,7 @@ class PowNodeListRow extends StandardListRow {
required bool isSelected}) required bool isSelected})
: super(title: title, onTap: onTap, isSelected: isSelected); : super(title: title, onTap: onTap, isSelected: isSelected);
final PowNode node; final Node node;
@override @override
Widget buildLeading(BuildContext context) { Widget buildLeading(BuildContext context) {

View file

@ -63,7 +63,7 @@ abstract class SettingsStoreBase with Store {
required this.appVersion, required this.appVersion,
required this.deviceName, required this.deviceName,
required Map<WalletType, Node> nodes, required Map<WalletType, Node> nodes,
required Map<WalletType, PowNode> powNodes, required Map<WalletType, Node> powNodes,
required this.shouldShowYatPopup, required this.shouldShowYatPopup,
required this.isBitcoinBuyEnabled, required this.isBitcoinBuyEnabled,
required this.actionlistDisplayMode, required this.actionlistDisplayMode,
@ -86,7 +86,7 @@ abstract class SettingsStoreBase with Store {
TransactionPriority? initialLitecoinTransactionPriority, TransactionPriority? initialLitecoinTransactionPriority,
TransactionPriority? initialEthereumTransactionPriority}) TransactionPriority? initialEthereumTransactionPriority})
: nodes = ObservableMap<WalletType, Node>.of(nodes), : nodes = ObservableMap<WalletType, Node>.of(nodes),
powNodes = ObservableMap<WalletType, PowNode>.of(powNodes), powNodes = ObservableMap<WalletType, Node>.of(powNodes),
_sharedPreferences = sharedPreferences, _sharedPreferences = sharedPreferences,
_backgroundTasks = backgroundTasks, _backgroundTasks = backgroundTasks,
fiatCurrency = initialFiatCurrency, fiatCurrency = initialFiatCurrency,
@ -477,7 +477,7 @@ abstract class SettingsStoreBase with Store {
final BackgroundTasks _backgroundTasks; final BackgroundTasks _backgroundTasks;
ObservableMap<WalletType, Node> nodes; ObservableMap<WalletType, Node> nodes;
ObservableMap<WalletType, PowNode> powNodes; ObservableMap<WalletType, Node> powNodes;
Node getCurrentNode(WalletType walletType) { Node getCurrentNode(WalletType walletType) {
final node = nodes[walletType]; final node = nodes[walletType];
@ -489,7 +489,7 @@ abstract class SettingsStoreBase with Store {
return node; return node;
} }
PowNode getCurrentPowNode(WalletType walletType) { Node getCurrentPowNode(WalletType walletType) {
final node = powNodes[walletType]; final node = powNodes[walletType];
if (node == null) { if (node == null) {
@ -509,7 +509,7 @@ abstract class SettingsStoreBase with Store {
static Future<SettingsStore> load( static Future<SettingsStore> load(
{required Box<Node> nodeSource, {required Box<Node> nodeSource,
required Box<PowNode> powNodeSource, required Box<Node> powNodeSource,
required bool isBitcoinBuyEnabled, required bool isBitcoinBuyEnabled,
FiatCurrency initialFiatCurrency = FiatCurrency.usd, FiatCurrency initialFiatCurrency = FiatCurrency.usd,
BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode.availableBalance, BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode.availableBalance,
@ -645,7 +645,7 @@ abstract class SettingsStoreBase with Store {
? AutoGenerateSubaddressStatus.deserialize(raw: generateSubaddresses) ? AutoGenerateSubaddressStatus.deserialize(raw: generateSubaddresses)
: defaultAutoGenerateSubaddressStatus; : defaultAutoGenerateSubaddressStatus;
final nodes = <WalletType, Node>{}; final nodes = <WalletType, Node>{};
final powNodes = <WalletType, PowNode>{}; final powNodes = <WalletType, Node>{};
if (moneroNode != null) { if (moneroNode != null) {
nodes[WalletType.monero] = moneroNode; nodes[WalletType.monero] = moneroNode;
@ -908,7 +908,7 @@ abstract class SettingsStoreBase with Store {
nodes[walletType] = node; nodes[walletType] = node;
} }
Future<void> _saveCurrentPowNode(PowNode node, WalletType walletType) async { Future<void> _saveCurrentPowNode(Node node, WalletType walletType) async {
switch (walletType) { switch (walletType) {
case WalletType.nano: case WalletType.nano:
await _sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, node.key as int); await _sharedPreferences.setInt(PreferencesKey.currentNanoPowNodeIdKey, node.key as int);

View file

@ -74,7 +74,7 @@ abstract class PowNodeCreateOrEditViewModelBase with Store {
} }
final WalletType _walletType; final WalletType _walletType;
final Box<PowNode> _nodeSource; final Box<Node> _nodeSource;
final SettingsStore _settingsStore; final SettingsStore _settingsStore;
@action @action
@ -114,8 +114,8 @@ abstract class PowNodeCreateOrEditViewModelBase with Store {
void setSocksProxyAddress(String val) => socksProxyAddress = val; void setSocksProxyAddress(String val) => socksProxyAddress = val;
@action @action
Future<void> save({PowNode? editingNode, bool saveAsCurrent = false}) async { Future<void> save({Node? editingNode, bool saveAsCurrent = false}) async {
final node = PowNode( final node = Node(
uri: uri, uri: uri,
type: _walletType, type: _walletType,
login: login, login: login,
@ -145,7 +145,7 @@ abstract class PowNodeCreateOrEditViewModelBase with Store {
@action @action
Future<void> connect() async { Future<void> connect() async {
final node = PowNode( final node = Node(
uri: uri, uri: uri,
type: _walletType, type: _walletType,
login: login, login: login,
@ -162,7 +162,7 @@ abstract class PowNodeCreateOrEditViewModelBase with Store {
} }
} }
PowNode? _existingNode(PowNode node) { Node? _existingNode(Node node) {
final nodes = _nodeSource.values.toList(); final nodes = _nodeSource.values.toList();
nodes.forEach((item) { nodes.forEach((item) {
item.login ??= ''; item.login ??= '';
@ -173,7 +173,7 @@ abstract class PowNodeCreateOrEditViewModelBase with Store {
} }
@action @action
void setAsCurrent(PowNode node) => _settingsStore.powNodes[_walletType] = node; void setAsCurrent(Node node) => _settingsStore.powNodes[_walletType] = node;
@action @action
Future<void> scanQRCodeForNewNode() async { Future<void> scanQRCodeForNewNode() async {

View file

@ -17,7 +17,7 @@ class PowNodeListViewModel = PowNodeListViewModelBase with _$PowNodeListViewMode
abstract class PowNodeListViewModelBase with Store { abstract class PowNodeListViewModelBase with Store {
PowNodeListViewModelBase(this._nodeSource, this._appStore) PowNodeListViewModelBase(this._nodeSource, this._appStore)
: nodes = ObservableList<PowNode>(), : nodes = ObservableList<Node>(),
settingsStore = _appStore.settingsStore { settingsStore = _appStore.settingsStore {
_bindNodes(); _bindNodes();
@ -27,7 +27,7 @@ abstract class PowNodeListViewModelBase with Store {
} }
@computed @computed
PowNode get currentNode { Node get currentNode {
final node = settingsStore.powNodes[_appStore.wallet!.type]; final node = settingsStore.powNodes[_appStore.wallet!.type];
if (node == null) { if (node == null) {
@ -41,15 +41,15 @@ abstract class PowNodeListViewModelBase with Store {
S.current.change_current_node(uri) + S.current.change_current_node(uri) +
'${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}'; '${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}';
final ObservableList<PowNode> nodes; final ObservableList<Node> nodes;
final SettingsStore settingsStore; final SettingsStore settingsStore;
final Box<PowNode> _nodeSource; final Box<Node> _nodeSource;
final AppStore _appStore; final AppStore _appStore;
Future<void> reset() async { Future<void> reset() async {
await resetPowToDefault(_nodeSource); await resetPowToDefault(_nodeSource);
PowNode node; Node node;
switch (_appStore.wallet!.type) { switch (_appStore.wallet!.type) {
case WalletType.nano: case WalletType.nano:
@ -63,9 +63,9 @@ abstract class PowNodeListViewModelBase with Store {
} }
@action @action
Future<void> delete(PowNode node) async => node.delete(); Future<void> delete(Node node) async => node.delete();
Future<void> setAsCurrent(PowNode node) async => Future<void> setAsCurrent(Node node) async =>
settingsStore.powNodes[_appStore.wallet!.type] = node; settingsStore.powNodes[_appStore.wallet!.type] = node;
@action @action