Skip to content

Commit

Permalink
Merge pull request #5 from x100111010/dev
Browse files Browse the repository at this point in the history
v0.3.19 updates ∧ testnet support
  • Loading branch information
x100111010 authored Oct 22, 2024
2 parents 6f35186 + 73daa98 commit f71161a
Show file tree
Hide file tree
Showing 51 changed files with 9,654 additions and 9,012 deletions.
1 change: 1 addition & 0 deletions lib/app_providers.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export 'coingecko/coingecko_providers.dart';
export 'contacts/contacts_providers.dart';
export 'core/core_providers.dart';
export 'node_settings/node_providers.dart';
export 'settings/settings_providers.dart';
export 'transactions/transaction_providers.dart';
export 'txnotes/txnotes_providers.dart';
Expand Down
26 changes: 18 additions & 8 deletions lib/core/core_providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ final stylesProvider = Provider((ref) {

final blockExplorerProvider = Provider((ref) {
final settings = ref.watch(blockExplorerSettingsProvider);
final network = ref.watch(networkProvider);
return settings.explorerForNetwork(network);
final networkId = ref.watch(networkIdProvider);
return settings.explorerForNetwork(networkId);
});

final sharedPrefsProvider =
Expand All @@ -81,6 +81,11 @@ final networkProvider = Provider((ref) {
return config.network;
});

final networkIdProvider = Provider((ref) {
final config = ref.watch(spectreNodeConfigProvider);
return config.networkId;
});

final addressPrefixProvider = Provider((ref) {
final network = ref.watch(networkProvider);
final prefix = addressPrefixForNetwork(network);
Expand All @@ -89,11 +94,16 @@ final addressPrefixProvider = Provider((ref) {
});

final _spectreApiProvider = Provider<SpectreApi>((ref) {
final network = ref.watch(networkProvider);
if (network == SpectreNetwork.mainnet) {
return SpectreApiMainnet('https://api.spectre-network.org');
}
return SpectreApiEmpty();
final networkId = ref.watch(networkIdProvider);
return switch (networkId) {
kSpectreNetworkIdMainnet =>
SpectreApiMainnet('https://api.spectre-network.org'),
kSpectreNetworkIdTestnet10 =>
SpectreApiMainnet('https://api-tn.spectre-network.org'),
kSpectreNetworkIdTestnet11 =>
SpectreApiMainnet('https://api-tn11.spectre-network.org'),
_ => SpectreApiEmpty(),
};
});

final spectreApiServiceProvider = Provider<SpectreApiService>((ref) {
Expand All @@ -117,7 +127,7 @@ final spectreClientProvider = Provider((ref) {
});

final balancesForAddressesProvider = FutureProvider.family
.autoDispose<Iterable<BalancesByAddressEntry>, List<String>>(
.autoDispose<Iterable<RpcBalancesByAddressesEntry>, List<String>>(
(ref, addresses) async {
final client = ref.watch(spectreClientProvider);
final balance = await client.getBalancesByAddresses(addresses);
Expand Down
4 changes: 2 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
Expand All @@ -8,6 +7,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'app.dart';
import 'app_providers.dart';
import 'database/database.dart';
import 'util/platform.dart';
import 'util/sharedprefsutil.dart';

void main() async {
Expand All @@ -27,7 +27,7 @@ void main() async {
);

// Setup logger
if (kDebugMode) {
if (kInDebugMode) {
Logger.level = Level.debug;
//debugRepaintRainbowEnabled = true;
} else {
Expand Down
22 changes: 20 additions & 2 deletions lib/node_settings/node_add_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ import '../widgets/buttons.dart';
import '../widgets/dialog.dart';
import '../widgets/sheet_widget.dart';
import '../widgets/validation_text.dart';
import 'node_providers.dart';
import 'node_types.dart';

class NodeAddSheet extends HookConsumerWidget {
const NodeAddSheet({Key? key}) : super(key: key);

@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themeProvider);
final styles = ref.watch(stylesProvider);
final l10n = l10nOf(context);

final stateNotifier = useState(const AddNodeSheetState());
Expand Down Expand Up @@ -105,19 +106,31 @@ class NodeAddSheet extends HookConsumerWidget {
final port = int.tryParse(url.split(':').last) ?? kMainnetRpcPort;
bool isSecure;
var nodeInfo;
String networkName;
try {
// Try secure connection first
client = SpectreClient.url(url, isSecure: true);
nodeInfo = await client.getInfo();
networkName = (await client.getBlockDagInfo()).networkName;
isSecure = true;
} catch (_) {
// Fallback to insecure connection
client = SpectreClient.url(url, isSecure: false);
nodeInfo = await client.getInfo();
networkName = (await client.getBlockDagInfo()).networkName;
isSecure = false;
}

final network = networkForPort(port);
SpectreNetwork network;
String suffix;
final parts = networkName.split('-');
if (parts.length > 1) {
network = SpectreNetwork.tryParse(parts[1]) ?? networkForPort(port);
suffix = parts.length == 3 ? parts[2] : '';
} else {
network = networkForPort(port);
suffix = '';
}

if (!nodeInfo.isSynced) {
throw Exception(l10n.nodeNotSyncedException);
Expand All @@ -133,6 +146,7 @@ class NodeAddSheet extends HookConsumerWidget {
name: name,
urls: [url],
network: network,
networkSuffix: suffix,
isSecure: isSecure,
);

Expand Down Expand Up @@ -188,6 +202,8 @@ class NodeAddSheet extends HookConsumerWidget {
AppTextField(
controller: nameController,
focusNode: nameFocusNode,
cursorColor: theme.primary,
style: styles.textStyleParagraphNormal,
hintText: state.showNameHint ? l10n.nodeNameHint : '',
textInputAction: TextInputAction.next,
textCapitalization: TextCapitalization.words,
Expand All @@ -199,6 +215,8 @@ class NodeAddSheet extends HookConsumerWidget {
AppTextField(
controller: urlController,
focusNode: urlFocusNode,
cursorColor: theme.primary,
style: styles.textStyleParagraphNormal,
hintText: state.showUrlHint ? l10n.nodeUrlHint : '',
textInputAction: TextInputAction.next,
keyboardType: TextInputType.url,
Expand Down
19 changes: 8 additions & 11 deletions lib/node_settings/node_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import '../app_providers.dart';
import '../app_styles.dart';
import '../l10n/l10n.dart';
import '../widgets/dialog.dart';
import 'node_providers.dart';
import 'node_types.dart';

final spectreNodeConfigItemProvider =
Expand All @@ -25,19 +24,19 @@ class NodeItem extends ConsumerWidget {
final activeConfig = ref.watch(spectreNodeConfigProvider);

Future<void> change() async {
final oldNetwork = ref.read(networkProvider);
final newNetwork = item.network;
final oldNetworkId = ref.read(networkIdProvider);
final newNetworkId = item.networkId;
final repository = ref.read(walletRepositoryProvider);
final wallet = ref.read(walletProvider);
if (oldNetwork != newNetwork) {
await repository.openWalletBoxes(wallet, network: newNetwork);
if (oldNetworkId != newNetworkId) {
await repository.openWalletBoxes(wallet, networkId: newNetworkId);
}

final notifier = ref.read(spectreNodeSettingsProvider.notifier);
await notifier.updateSelected(item.config);

if (oldNetwork != newNetwork) {
await repository.closeWalletBoxes(wallet, network: oldNetwork);
if (oldNetworkId != newNetworkId) {
await repository.closeWalletBoxes(wallet, networkId: oldNetworkId);
}
}

Expand Down Expand Up @@ -88,9 +87,7 @@ class NodeItem extends ConsumerWidget {
value: item,
groupValue: activeConfig,
activeColor: theme.primary,
onChanged: (_) {
change();
},
onChanged: (_) => change(),
),
const SizedBox(width: 10),
Expanded(
Expand All @@ -115,7 +112,7 @@ class NodeItem extends ConsumerWidget {
borderRadius: BorderRadius.circular(4),
),
child: Text(
item.network.name.toUpperCase(),
item.networkId.toUpperCase(),
style: styles.tagText.copyWith(fontSize: 10),
),
),
Expand Down
5 changes: 5 additions & 0 deletions lib/node_settings/node_types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,11 @@ class NodeConfig with _$NodeConfig {
@Default(false) bool isSecure,
required List<String> urls,
required SpectreNetwork network,
@Default('') String networkSuffix,
}) = _NodeConfig;

String get networkId => network.idWithSuffix(networkSuffix);

factory NodeConfig.fromJson(Map<String, dynamic> json) =>
_$NodeConfigFromJson(json);
}
Expand All @@ -52,8 +55,10 @@ class ActiveNodeConfig with _$ActiveNodeConfig {

String get name => config.name;
SpectreNetwork get network => config.network;

bool get isSecure => config.isSecure;
late final String url = config.urls[Random().nextInt(config.urls.length)];
late final String networkId = config.networkId;
}

@freezed
Expand Down
1 change: 0 additions & 1 deletion lib/node_settings/nodes_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import '../widgets/sheet_util.dart';
import '../widgets/sheet_widget.dart';
import 'node_add_sheet.dart';
import 'node_item.dart';
import 'node_providers.dart';
import 'node_types.dart';

class ListViewEndItem extends ConsumerWidget {
Expand Down
4 changes: 2 additions & 2 deletions lib/screens/logout_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ class LogoutScreen extends HookConsumerWidget {
Future<void> logout() async {
try {
final notifier = ref.read(walletBundleProvider.notifier);
final network = ref.read(networkProvider);
await notifier.logout(network);
final networkId = ref.read(networkIdProvider);
await notifier.logout(networkId);
} catch (e, st) {
final log = ref.read(loggerProvider);
log.e('Failed to logout', error: e, stackTrace: st);
Expand Down
4 changes: 4 additions & 0 deletions lib/screens/privacy_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter_portal/flutter_portal.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

import '../app_providers.dart';
import '../util/platform.dart';
import 'privacy_overlay.dart';

class PrivacyScreen extends HookConsumerWidget {
Expand Down Expand Up @@ -33,6 +34,9 @@ class PrivacyScreen extends HookConsumerWidget {
inactive.value = false;
break;
case AppLifecycleState.inactive:
if (kInDebugMode && kPlatformIsMacOS) {
break;
}
inactive.value = true;
break;
case AppLifecycleState.hidden:
Expand Down
7 changes: 4 additions & 3 deletions lib/screens/setup_wallet_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,10 @@ class SetupWalletScreen extends HookConsumerWidget {

// setup wallet
final network = ref.read(networkProvider);
final networkId = ref.read(networkIdProvider);
final notifier = ref.read(walletBundleProvider.notifier);
final wallet = await notifier.setupWallet(walletData);
await notifier.selectWallet(wallet, network);
await notifier.selectWallet(wallet, networkId);

final auth = ref.read(walletAuthNotifierProvider);
if (auth == null) throw Exception('No active wallet');
Expand Down Expand Up @@ -124,7 +125,7 @@ class SetupWalletScreen extends HookConsumerWidget {
}

final walletRepository = ref.read(walletRepositoryProvider);
await walletRepository.openWalletBoxes(wallet, network: network);
await walletRepository.openWalletBoxes(wallet, networkId: networkId);

final addressBox = ref.read(addressBoxProvider(wallet));

Expand All @@ -137,7 +138,7 @@ class SetupWalletScreen extends HookConsumerWidget {
final txCache = ref.read(txCacheServiceProvider(wallet));
await txCache.addWalletTxIds(discovery.txIds);

await walletRepository.closeWalletBoxes(wallet, network: network);
await walletRepository.closeWalletBoxes(wallet, networkId: networkId);

message.value = l10n.fetchingTransactions;
details.value = '';
Expand Down
4 changes: 2 additions & 2 deletions lib/screens/splash_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ class SplashScreen extends HookConsumerWidget {
}
// open database boxes for selected wallet
final walletRepository = ref.read(walletRepositoryProvider);
final network = ref.read(networkProvider);
await walletRepository.openWalletBoxes(wallet, network: network);
final networkId = ref.read(networkIdProvider);
await walletRepository.openWalletBoxes(wallet, networkId: networkId);

appRouter.openWallet(context);
}
Expand Down
32 changes: 12 additions & 20 deletions lib/send_sheet/send_confirm_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ class SendConfirmSheet extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themeProvider);
final l10n = l10nOf(context);
final styles = ref.watch(stylesProvider);
final l10n = l10nOf(context);

final toAddress = tx.toAddress;
final amount = tx.amount;
Expand Down Expand Up @@ -95,16 +95,12 @@ class SendConfirmSheet extends HookConsumerWidget {
}

String? checkMissingBalance() {
final balance = ref.read(totalBalanceProvider).raw;
if (balance < amount.raw) {
return 'SPR';
}
final balanceRaw = ref.read(totalBalanceProvider).raw;

if (fee != null) {
if (balance < amount.raw + fee) {
return amount.symbolLabel;
}
if (balanceRaw < amount.raw + fee) {
return amount.symbolLabel;
}

return null;
}

Expand Down Expand Up @@ -156,18 +152,14 @@ class SendConfirmSheet extends HookConsumerWidget {
),
),
AddressCard(address: toAddress),
if (fee != null) ...[
Container(
margin: const EdgeInsets.only(top: 30, bottom: 10),
child: Text(
l10n.fee.toUpperCase(),
style: styles.textStyleSubHeader,
),
),
AmountCard(
amount: Amount.raw(fee),
Container(
margin: const EdgeInsets.only(top: 30, bottom: 10),
child: Text(
l10n.fee.toUpperCase(),
style: styles.textStyleSubHeader,
),
],
),
AmountCard(amount: Amount.raw(fee)),
if (note != null)
Padding(
padding: const EdgeInsets.only(
Expand Down
7 changes: 3 additions & 4 deletions lib/settings/block_explorer_notifier.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../spectre/spectre.dart';
import 'block_explorer_settings.dart';
import 'block_explorers.dart';
import 'settings_repository.dart';

const _kBlockExplorerConfigKey = '_kBlockExplorerConfigKey';
const _kBlockExplorerConfigKey = '_kBlockExplorerConfigKeyV2';

extension BlockExplorerSettingsExtension on SettingsRepository {
BlockExplorerSettings getBlockExplorerSettings() {
Expand All @@ -29,10 +28,10 @@ class BlockExplorerNotifier extends StateNotifier<BlockExplorerSettings> {

Future<void> updateBlockExplorer(
BlockExplorer explorer, {
required SpectreNetwork network,
required String networkId,
}) {
final selection = Map.of(state.selection);
selection[network] = explorer;
selection[networkId] = explorer;
state = state.copyWith(
selection: selection,
);
Expand Down
Loading

0 comments on commit f71161a

Please sign in to comment.