Files
peyawallet/lib/state/providers.dart
T
Codex Bot 9b7597f782
build / Build Linux wallet (push) Successful in 2m19s
build / Build Windows wallet (push) Successful in 21m3s
Add Windows local node service
2026-04-18 17:03:37 +02:00

99 lines
3.3 KiB
Dart

import 'dart:io';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:logger/logger.dart';
import '../data/config_repository.dart';
import '../data/wallet_repository.dart';
import '../domain/models.dart';
import '../native/wallet_backend.dart';
import '../native/wallet_backend_factory.dart';
import '../services/linux_local_node_service.dart';
import '../services/local_node_service.dart';
import '../services/noop_local_node_service.dart';
import '../services/noop_tray_service.dart';
import '../services/sync_scheduler.dart';
import '../services/tray_service.dart';
import '../services/windows_local_node_service.dart';
import '../services/window_lifecycle_service.dart';
import 'app_config_controller.dart';
import 'wallet_controller.dart';
final loggerProvider = Provider<Logger>((ref) => Logger());
final configRepositoryProvider = Provider<ConfigRepository>((ref) {
throw UnimplementedError('ConfigRepository must be overridden in main.');
});
final appConfigControllerProvider = StateNotifierProvider<AppConfigController, AppConfig>((ref) {
throw UnimplementedError('AppConfigController must be overridden in main.');
});
final walletBackendProvider = Provider<WalletBackend>((ref) {
final logger = ref.watch(loggerProvider);
return WalletBackendFactory.create(logger: logger);
});
final walletRepositoryProvider = Provider<WalletRepository>((ref) {
return WalletRepository(ref.watch(walletBackendProvider));
});
final walletControllerProvider = StateNotifierProvider<WalletController, WalletState>((ref) {
return WalletController(
repository: ref.watch(walletRepositoryProvider),
logger: ref.watch(loggerProvider),
readConfig: () => ref.read(appConfigControllerProvider),
);
});
final walletConfigSyncProvider = Provider<void>((ref) {
ref.listen<WalletState>(walletControllerProvider, (previous, next) {
final nextWallet = next.walletInfo;
if (nextWallet == null) {
return;
}
final prevPath = previous?.walletInfo?.path;
if (prevPath == nextWallet.path) {
return;
}
ref.read(appConfigControllerProvider.notifier).setLastWallet(nextWallet);
});
});
final trayServiceProvider = Provider<TrayService>((ref) {
return NoopTrayService();
});
final localNodeServiceProvider = Provider<LocalNodeService>((ref) {
final logger = ref.watch(loggerProvider);
if (Platform.isLinux) {
return LinuxLocalNodeService(logger: logger);
}
if (Platform.isWindows) {
return WindowsLocalNodeService(logger: logger);
}
return NoopLocalNodeService();
});
final windowLifecycleServiceProvider = Provider<WindowLifecycleService>((ref) {
final tray = ref.read(trayServiceProvider);
return WindowLifecycleService(
trayService: tray,
readConfig: () => ref.read(appConfigControllerProvider),
onBeforeClose: () => ref.read(walletRepositoryProvider).closeWallet(),
);
});
final syncSchedulerProvider = Provider<SyncScheduler>((ref) {
final scheduler = SyncScheduler(
onSync: () => ref.read(walletControllerProvider.notifier).syncNow(),
);
final config = ref.read(appConfigControllerProvider);
scheduler.configure(enabled: config.autoSync, interval: config.autoSyncInterval);
ref.listen<AppConfig>(appConfigControllerProvider, (previous, next) {
scheduler.configure(enabled: next.autoSync, interval: next.autoSyncInterval);
});
ref.onDispose(scheduler.dispose);
return scheduler;
});