import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/cache/cache_service.dart'; import '../../core/cache/image_cache_service.dart'; import '../../core/database/app_database.dart'; import '../../core/database/database_service.dart'; import '../../core/http/network_info.dart'; import '../../core/utils/result.dart'; import '../providers/provider_factory.dart'; import '../providers/provider_manager.dart'; import '../models/download_task.dart'; import '../models/downloaded_media.dart'; import '../models/post.dart'; import '../repositories/collection_repository.dart'; import '../repositories/downloaded_media_repository.dart'; import '../repositories/favorite_repository.dart'; import '../repositories/post_repository.dart'; import '../repositories/provider_repository.dart'; import '../repositories/search_repository.dart'; import '../repositories/viewed_post_repository.dart'; import '../services/collection_service.dart'; import '../services/download_service.dart'; import '../services/download_manager_service.dart'; import '../services/downloaded_media_service.dart'; import '../services/favorite_service.dart'; import '../services/feed_service.dart'; import '../services/provider_check_service.dart'; import '../services/search_service.dart'; import '../services/tag_cache_service.dart'; import '../services/settings_service.dart'; import '../services/update_service.dart'; import '../services/viewed_history_service.dart'; import '../services/backup_service.dart'; final appDatabaseProvider = FutureProvider((ref) async { final database = await AppDatabase.open(); ref.onDispose(database.close); return database; }); final databaseServiceProvider = Provider((ref) { final database = ref.watch(appDatabaseProvider).requireValue; return DatabaseService(database); }); final connectivityProvider = Provider((ref) => Connectivity()); final networkInfoProvider = Provider((ref) { return NetworkInfo(ref.watch(connectivityProvider)); }); final providerFactoryProvider = Provider((ref) { return ProviderFactory(); }); final postRepositoryProvider = Provider((ref) { return PostRepository(ref.watch(databaseServiceProvider)); }); final providerRepositoryProvider = Provider((ref) { return ProviderRepository(ref.watch(databaseServiceProvider)); }); final searchRepositoryProvider = Provider((ref) { return SearchRepository(ref.watch(databaseServiceProvider)); }); final viewedPostRepositoryProvider = Provider((ref) { return ViewedPostRepository(ref.watch(databaseServiceProvider)); }); final downloadedMediaRepositoryProvider = Provider((ref) { return DownloadedMediaRepository(ref.watch(databaseServiceProvider)); }); final favoriteRepositoryProvider = Provider((ref) { return FavoriteRepository( ref.watch(databaseServiceProvider), ref.watch(postRepositoryProvider), ); }); final collectionRepositoryProvider = Provider((ref) { return CollectionRepository( ref.watch(databaseServiceProvider), ref.watch(postRepositoryProvider), ); }); final cacheServiceProvider = Provider((ref) { return CacheService(ref.watch(databaseServiceProvider)); }); final imageCacheServiceProvider = Provider((ref) { return ImageCacheService(); }); final providerManagerProvider = Provider((ref) { return ProviderManager( ref.watch(providerRepositoryProvider), ref.watch(providerFactoryProvider), ); }); final feedServiceProvider = Provider((ref) { return FeedService( ref.watch(providerManagerProvider), ref.watch(cacheServiceProvider), ref.watch(settingsServiceProvider), ref.watch(viewedHistoryServiceProvider), ); }); final viewedHistoryServiceProvider = Provider((ref) { return ViewedHistoryService( ref.watch(viewedPostRepositoryProvider), ref.watch(postRepositoryProvider), ); }); final viewedKeysProvider = FutureProvider>((ref) async { final result = await ref.watch(viewedHistoryServiceProvider).getViewedKeys(); return result is Success> ? result.data : {}; }); final tagCacheServiceProvider = Provider((ref) { final service = TagCacheService(); unawaited(service.init()); return service; }); final searchServiceProvider = Provider((ref) { return SearchService( ref.watch(searchRepositoryProvider), ref.watch(providerManagerProvider), ref.watch(tagCacheServiceProvider), ); }); final providerCheckServiceProvider = Provider((ref) { return ProviderCheckService( ref.watch(providerRepositoryProvider), ref.watch(providerFactoryProvider), ref.watch(providerManagerProvider), ); }); final favoriteServiceProvider = Provider((ref) { return FavoriteService( ref.watch(favoriteRepositoryProvider), ref.watch(postRepositoryProvider), ); }); final collectionServiceProvider = Provider((ref) { return CollectionService(ref.watch(collectionRepositoryProvider)); }); final settingsServiceProvider = Provider((ref) { return SettingsService( ref.watch(databaseServiceProvider), providerRepository: ref.watch(providerRepositoryProvider), ); }); final downloadServiceProvider = Provider((ref) { return DownloadService(); }); final downloadedMediaServiceProvider = Provider((ref) { return DownloadedMediaService(ref.watch(downloadedMediaRepositoryProvider)); }); final downloadManagerServiceProvider = Provider((ref) { return DownloadManagerService( ref.watch(downloadServiceProvider), downloadedMediaService: ref.watch(downloadedMediaServiceProvider), settingsService: ref.watch(settingsServiceProvider), ); }); final downloadedMediaByKeysProvider = FutureProvider.family, Iterable>( (ref, keys) async { final result = await ref.watch(downloadedMediaServiceProvider).allByKeys(keys); return result is Success> ? result.data : const {}; }); final downloadedMediaByKeyProvider = FutureProvider.family((ref, cacheKey) async { final result = await ref.watch(downloadedMediaServiceProvider).getByCacheKey(cacheKey); return result is Success ? result.data : null; }); final postMediaHeadersProvider = FutureProvider.family, Post>((ref, post) async { final result = await ref.watch(providerManagerProvider).getMediaHeaders(post); return result is Success> ? result.data : const {}; }); final downloadTasksProvider = StreamProvider>((ref) { final manager = ref.watch(downloadManagerServiceProvider); return manager.stream; }); final updateServiceProvider = Provider((ref) { return UpdateService( Dio( BaseOptions( connectTimeout: const Duration(seconds: 12), receiveTimeout: const Duration(seconds: 12), headers: const { 'User-Agent': 'Lunaris/2.0.1 Flutter local booru browser', 'Accept': 'application/json', }, ), ), ref.watch(settingsServiceProvider), ); }); final backupServiceProvider = Provider((ref) { return BackupService(ref.watch(settingsServiceProvider)); });