MotorSignal-App/lib/services/sync/sync_providers.dart

52 lines
2.3 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../database/database.dart';
import '../../features/records/records_service.dart';
import '../auth/auth_providers.dart';
import '../github/github_auth_service.dart';
import '../github/github_sync_service.dart';
import 'firebase_sync_provider.dart';
import 'github_sync_provider.dart';
import 'r2_upload_service.dart';
import 'sync_bundle_worker.dart';
import 'sync_manager.dart';
import 'sync_outbox.dart';
final r2UploadServiceProvider = Provider<R2UploadService>((ref) => R2UploadService());
final syncBundleWorkerProvider = Provider<SyncBundleWorker>((ref) => SyncBundleWorker(ref.watch(databaseProvider)));
final syncOutboxProvider = Provider<SyncOutbox>((ref) => SyncOutbox(ref.watch(sharedPreferencesProvider)));
final firebaseSyncProvider = Provider<FirebaseSyncProvider>((ref) => FirebaseSyncProvider(
db: ref.watch(databaseProvider),
authService: ref.watch(authServiceProvider),
bundleWorker: ref.watch(syncBundleWorkerProvider),
r2UploadService: ref.watch(r2UploadServiceProvider),
));
final githubSyncProvider = Provider<GitHubSyncProvider>((ref) => GitHubSyncProvider(
service: ref.watch(githubSyncServiceProvider),
auth: ref.watch(githubAuthServiceProvider),
));
final syncManagerProvider = ChangeNotifierProvider<SyncManager>((ref) {
final manager = SyncManager(
ref.watch(syncOutboxProvider),
initialProviders: [ref.watch(firebaseSyncProvider), ref.watch(githubSyncProvider)],
defaultProviderId: 'firebase',
);
// A successful Firebase/Google/Email sign-in must automatically release
// rides that were durably parked in AUTH_REQUIRED. Sign-out does not delete
// or cancel them; they remain local/pending until another authenticated session.
ref.listen<AuthState>(authNotifierProvider, (previous, next) {
if (next.isAuthenticated && previous?.isAuthenticated != true) {
manager.retryAuthRequired();
}
});
ref.onDispose(manager.dispose);
return manager;
});
final syncStateProvider = Provider<SyncManagerState>((ref) => ref.watch(syncManagerProvider).currentState);
final pendingSyncCountProvider = Provider<int>((ref) => ref.watch(syncStateProvider).pendingCount);
final isSyncProcessingProvider = Provider<bool>((ref) => ref.watch(syncStateProvider).isProcessing);