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((ref) => R2UploadService()); final syncBundleWorkerProvider = Provider((ref) => SyncBundleWorker(ref.watch(databaseProvider))); final syncOutboxProvider = Provider((ref) => SyncOutbox(ref.watch(sharedPreferencesProvider))); final firebaseSyncProvider = Provider((ref) => FirebaseSyncProvider( db: ref.watch(databaseProvider), authService: ref.watch(authServiceProvider), bundleWorker: ref.watch(syncBundleWorkerProvider), r2UploadService: ref.watch(r2UploadServiceProvider), )); final githubSyncProvider = Provider((ref) => GitHubSyncProvider( service: ref.watch(githubSyncServiceProvider), auth: ref.watch(githubAuthServiceProvider), )); final syncManagerProvider = ChangeNotifierProvider((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(authNotifierProvider, (previous, next) { if (next.isAuthenticated && previous?.isAuthenticated != true) { manager.retryAuthRequired(); } }); ref.onDispose(manager.dispose); return manager; }); final syncStateProvider = Provider((ref) => ref.watch(syncManagerProvider).currentState); final pendingSyncCountProvider = Provider((ref) => ref.watch(syncStateProvider).pendingCount); final isSyncProcessingProvider = Provider((ref) => ref.watch(syncStateProvider).isProcessing);