99 lines
3.3 KiB
Dart
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;
|
|
});
|