From 3eb0dc25348e34cbc2a5c36bc35699a7a451c36a Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:43:50 +0200 Subject: [PATCH 1/4] Fix Exception ``` Exception has occurred. ArgumentError (Invalid argument(s): No host specified in URI ) ``` at line 79: `final req = await http.get(Uri.parse(source.sourceCodeUrl!));` when source.sourceCodeUrl is empty. --- lib/services/fetch_sources_list.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index d78ed722..d9674015 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -42,7 +42,8 @@ Future fetchSourcesList({ (source) => source.id == id, orElse: () => Source(), ); - if (matchingSource.id != null) { + if (matchingSource.id != null && + matchingSource.sourceCodeUrl!.isNotEmpty) { await _updateSource(matchingSource, ref, repo, itemType); } } else { From 8bc8a99af87ced0d9a8269d2fa13a6f552f89ec0 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 6 Jun 2025 23:27:05 +0200 Subject: [PATCH 2/4] Make the write transaction fully async Mixing `writeTxnSync` with `await` was incorrect. writeTxnSync does not support awaiting async functions. --- lib/services/fetch_sources_list.dart | 77 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index d9674015..40bf71f5 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -36,36 +36,34 @@ Future fetchSourcesList({ ) .toList(); - isar.writeTxnSync(() async { - if (id != null) { - final matchingSource = sourceList.firstWhere( - (source) => source.id == id, - orElse: () => Source(), - ); - if (matchingSource.id != null && - matchingSource.sourceCodeUrl!.isNotEmpty) { - await _updateSource(matchingSource, ref, repo, itemType); + if (id != null) { + final matchingSource = sourceList.firstWhere( + (source) => source.id == id, + orElse: () => Source(), + ); + if (matchingSource.id != null && matchingSource.sourceCodeUrl!.isNotEmpty) { + await _updateSource(matchingSource, ref, repo, itemType); + } + } else { + for (var source in sourceList) { + final existingSource = await isar.sources.get(source.id!); + if (existingSource == null) { + await _addNewSource(source, ref, repo, itemType); + continue; } - } else { - for (var source in sourceList) { - final existingSource = isar.sources.getSync(source.id!); - if (existingSource != null) { - if (existingSource.isAdded! && - compareVersions(existingSource.version!, source.version!) < 0) { - if (ref.watch(autoUpdateExtensionsStateProvider)) { - await _updateSource(source, ref, repo, itemType); - } else { - isar.sources.putSync( - existingSource..versionLast = source.version, - ); - } - } - } else { - _addNewSource(source, ref, repo, itemType); - } + final shouldUpdate = + existingSource.isAdded! && + compareVersions(existingSource.version!, source.version!) < 0; + if (!shouldUpdate) continue; + if (ref.read(autoUpdateExtensionsStateProvider)) { + await _updateSource(source, ref, repo, itemType); + } else { + await isar.writeTxn(() async { + isar.sources.put(existingSource..versionLast = source.version); + }); } } - }); + } checkIfSourceIsObsolete(sourceList, repo!, itemType, ref); } @@ -109,9 +107,7 @@ Future _updateSource( ..notes = source.notes ..repo = repo; - isar.writeTxnSync(() { - isar.sources.putSync(updatedSource); - }); + await isar.writeTxn(() async => isar.sources.put(updatedSource)); ref .read(synchingProvider(syncId: 1).notifier) .addChangedPart( @@ -122,7 +118,12 @@ Future _updateSource( ); } -void _addNewSource(Source source, Ref ref, Repo? repo, ItemType itemType) { +Future _addNewSource( + Source source, + Ref ref, + Repo? repo, + ItemType itemType, +) async { final newSource = Source() ..sourceCodeUrl = source.sourceCodeUrl ..id = source.id @@ -146,27 +147,27 @@ void _addNewSource(Source source, Ref ref, Repo? repo, ItemType itemType) { ..isObsolete = false ..notes = source.notes ..repo = repo; - isar.sources.putSync(newSource); + await isar.writeTxn(() async => isar.sources.put(newSource)); ref .read(synchingProvider(syncId: 1).notifier) .addChangedPart(ActionType.addExtension, null, newSource.toJson(), false); } -void checkIfSourceIsObsolete( +Future checkIfSourceIsObsolete( List sourceList, Repo repo, ItemType itemType, Ref ref, -) { +) async { if (sourceList.isEmpty) return; - final sources = isar.sources + final sources = await isar.sources .filter() .idIsNotNull() .itemTypeEqualTo(itemType) .and() .isLocalEqualTo(false) - .findAllSync(); + .findAll(); if (sources.isEmpty) return; @@ -177,7 +178,7 @@ void checkIfSourceIsObsolete( if (sourceIds.isEmpty) return; - isar.writeTxnSync(() { + await isar.writeTxn(() async { for (var source in sources) { final isNowObsolete = !sourceIds.contains(source.id) && @@ -185,7 +186,7 @@ void checkIfSourceIsObsolete( if (source.isObsolete != isNowObsolete) { source.isObsolete = isNowObsolete; - isar.sources.putSync(source); + await isar.sources.put(source); ref .read(synchingProvider(syncId: 1).notifier) From 138e2887e0566098325bb166ccdb57ac4c9c05ae Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sat, 7 Jun 2025 02:37:51 +0200 Subject: [PATCH 3/4] Fix Extension Installation There was a bug when uninstalling an extension and trying to reinstall it, it didn't install. You had to restart the app to reinstall the same extension again. Now the provider is invalidated when reinstalling an uninstalled extension, so the fetch logic is triggered correctly. Prevents stale cache issues from Riverpod's keepAlive behavior. --- .../widgets/extension_list_tile_widget.dart | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart index 474d0cbf..7e8b2d8a 100644 --- a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart +++ b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart @@ -45,28 +45,20 @@ class _ExtensionListTileWidgetState setState(() => _isLoading = true); try { - final future = switch (widget.source.itemType) { - ItemType.manga => ref.watch( - fetchMangaSourcesListProvider( - id: widget.source.id, - reFresh: true, - ).future, + final provider = switch (widget.source.itemType) { + ItemType.manga => fetchMangaSourcesListProvider( + id: widget.source.id, + reFresh: true, ), - ItemType.anime => ref.watch( - fetchAnimeSourcesListProvider( - id: widget.source.id, - reFresh: true, - ).future, - ), - _ => ref.watch( - fetchNovelSourcesListProvider( - id: widget.source.id, - reFresh: true, - ).future, + ItemType.anime => fetchAnimeSourcesListProvider( + id: widget.source.id, + reFresh: true, ), + _ => fetchNovelSourcesListProvider(id: widget.source.id, reFresh: true), }; - await future; + if (!widget.source.isAdded!) ref.invalidate(provider); + await ref.watch(provider.future); } finally { if (mounted) setState(() => _isLoading = false); } From fecda493732e8aa8fc5f4a404a7974e41b8eb0cc Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sat, 7 Jun 2025 03:24:39 +0200 Subject: [PATCH 4/4] Merge Provider => Remove Code Duplication Merge `fetchMangaSourcesListProvider`, `fetchAnimeSourcesListProvider` and `fetchNovelSourcesListProvider` into a single Provider, `FetchItemSourcesListProvider`, reducing code duplication. --- .../browse/extension/extension_screen.dart | 60 +++--- .../widgets/extension_list_tile_widget.dart | 21 +-- lib/modules/main_view/main_screen.dart | 16 +- .../providers/browse_state_provider.dart | 22 +-- ...e_sources.dart => fetch_item_sources.dart} | 9 +- ...urces.g.dart => fetch_item_sources.g.dart} | 96 ++++++---- lib/services/fetch_manga_sources.dart | 23 --- lib/services/fetch_manga_sources.g.dart | 178 ------------------ lib/services/fetch_novel_sources.dart | 23 --- lib/services/fetch_novel_sources.g.dart | 178 ------------------ 10 files changed, 107 insertions(+), 519 deletions(-) rename lib/services/{fetch_anime_sources.dart => fetch_item_sources.dart} (77%) rename lib/services/{fetch_anime_sources.g.dart => fetch_item_sources.g.dart} (55%) delete mode 100644 lib/services/fetch_manga_sources.dart delete mode 100644 lib/services/fetch_manga_sources.g.dart delete mode 100644 lib/services/fetch_novel_sources.dart delete mode 100644 lib/services/fetch_novel_sources.g.dart diff --git a/lib/modules/browse/extension/extension_screen.dart b/lib/modules/browse/extension/extension_screen.dart index fce8e5fe..226bc4e2 100644 --- a/lib/modules/browse/extension/extension_screen.dart +++ b/lib/modules/browse/extension/extension_screen.dart @@ -4,11 +4,9 @@ import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/browse/extension/providers/extensions_provider.dart'; -import 'package:mangayomi/services/fetch_anime_sources.dart'; -import 'package:mangayomi/services/fetch_manga_sources.dart'; +import 'package:mangayomi/services/fetch_item_sources.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; -import 'package:mangayomi/services/fetch_novel_sources.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:mangayomi/modules/browse/extension/widgets/extension_list_tile_widget.dart'; @@ -30,48 +28,34 @@ class _ExtensionScreenState extends ConsumerState { final ScrollController controller = ScrollController(); bool isUpdating = false; Future _refreshSources() { - return switch (widget.itemType) { - ItemType.manga => ref.refresh( - fetchMangaSourcesListProvider(id: null, reFresh: true).future, - ), - ItemType.anime => ref.refresh( - fetchAnimeSourcesListProvider(id: null, reFresh: true).future, - ), - _ => ref.refresh( - fetchNovelSourcesListProvider(id: null, reFresh: true).future, - ), - }; + return ref.refresh( + fetchItemSourcesListProvider( + id: null, + reFresh: true, + itemType: widget.itemType, + ).future, + ); } Future _updateSource(Source source) { - switch (source.itemType) { - case ItemType.manga: - return ref.read( - fetchMangaSourcesListProvider(id: source.id, reFresh: true).future, - ); - case ItemType.anime: - return ref.read( - fetchAnimeSourcesListProvider(id: source.id, reFresh: true).future, - ); - default: - return ref.read( - fetchNovelSourcesListProvider(id: source.id, reFresh: true).future, - ); - } + return ref.read( + fetchItemSourcesListProvider( + id: source.id, + reFresh: true, + itemType: source.itemType, + ).future, + ); } @override Widget build(BuildContext context) { - switch (widget.itemType) { - case ItemType.manga: - ref.read(fetchMangaSourcesListProvider(id: null, reFresh: false)); - break; - case ItemType.anime: - ref.read(fetchAnimeSourcesListProvider(id: null, reFresh: false)); - break; - default: - ref.read(fetchNovelSourcesListProvider(id: null, reFresh: false)); - } + ref.read( + fetchItemSourcesListProvider( + id: null, + reFresh: false, + itemType: widget.itemType, + ), + ); final streamExtensions = ref.watch( getExtensionsStreamProvider(widget.itemType), diff --git a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart index 7e8b2d8a..a2ff48db 100644 --- a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart +++ b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart @@ -1,12 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; -import 'package:mangayomi/services/fetch_anime_sources.dart'; -import 'package:mangayomi/services/fetch_manga_sources.dart'; +import 'package:mangayomi/services/fetch_item_sources.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; -import 'package:mangayomi/services/fetch_novel_sources.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -45,17 +42,11 @@ class _ExtensionListTileWidgetState setState(() => _isLoading = true); try { - final provider = switch (widget.source.itemType) { - ItemType.manga => fetchMangaSourcesListProvider( - id: widget.source.id, - reFresh: true, - ), - ItemType.anime => fetchAnimeSourcesListProvider( - id: widget.source.id, - reFresh: true, - ), - _ => fetchNovelSourcesListProvider(id: widget.source.id, reFresh: true), - }; + final provider = fetchItemSourcesListProvider( + id: widget.source.id, + reFresh: true, + itemType: widget.source.itemType, + ); if (!widget.source.isAdded!) ref.invalidate(provider); await ref.watch(provider.future); diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index d1ce7519..54de0244 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -14,14 +14,12 @@ import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/widgets/loading_icon.dart'; -import 'package:mangayomi/services/fetch_anime_sources.dart'; -import 'package:mangayomi/services/fetch_manga_sources.dart'; +import 'package:mangayomi/services/fetch_item_sources.dart'; import 'package:mangayomi/modules/main_view/providers/migration.dart'; import 'package:mangayomi/modules/more/about/providers/check_for_update.dart'; import 'package:mangayomi/modules/more/data_and_storage/providers/auto_backup.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/router/router.dart'; -import 'package:mangayomi/services/fetch_novel_sources.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -107,9 +105,15 @@ class _MainScreenState extends ConsumerState { Future.microtask(() { if (mounted) { ref.read(checkForUpdateProvider(context: context)); - ref.read(fetchMangaSourcesListProvider(id: null, reFresh: false)); - ref.read(fetchAnimeSourcesListProvider(id: null, reFresh: false)); - ref.read(fetchNovelSourcesListProvider(id: null, reFresh: false)); + for (var type in ItemType.values) { + ref.read( + FetchItemSourcesListProvider( + id: null, + reFresh: false, + itemType: type, + ), + ); + } } }); } diff --git a/lib/modules/more/settings/browse/providers/browse_state_provider.dart b/lib/modules/more/settings/browse/providers/browse_state_provider.dart index 34436407..a8791fda 100644 --- a/lib/modules/more/settings/browse/providers/browse_state_provider.dart +++ b/lib/modules/more/settings/browse/providers/browse_state_provider.dart @@ -5,9 +5,7 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; -import 'package:mangayomi/services/fetch_anime_sources.dart'; -import 'package:mangayomi/services/fetch_manga_sources.dart'; -import 'package:mangayomi/services/fetch_novel_sources.dart'; +import 'package:mangayomi/services/fetch_item_sources.dart'; import 'package:mangayomi/services/http/m_client.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'browse_state_provider.g.dart'; @@ -57,17 +55,13 @@ class ExtensionsRepoState extends _$ExtensionsRepoState { a; }); try { - final a = switch (itemType) { - ItemType.manga => ref.refresh( - fetchMangaSourcesListProvider(id: null, reFresh: false).future, - ), - ItemType.anime => ref.refresh( - fetchAnimeSourcesListProvider(id: null, reFresh: false).future, - ), - _ => ref.refresh( - fetchNovelSourcesListProvider(id: null, reFresh: false).future, - ), - }; + final a = ref.refresh( + fetchItemSourcesListProvider( + id: null, + reFresh: false, + itemType: itemType, + ).future, + ); Future.wait([a]); } catch (_) {} } diff --git a/lib/services/fetch_anime_sources.dart b/lib/services/fetch_item_sources.dart similarity index 77% rename from lib/services/fetch_anime_sources.dart rename to lib/services/fetch_item_sources.dart index 3674ebba..9b6362e6 100644 --- a/lib/services/fetch_anime_sources.dart +++ b/lib/services/fetch_item_sources.dart @@ -4,23 +4,24 @@ import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_pr import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -part 'fetch_anime_sources.g.dart'; +part 'fetch_item_sources.g.dart'; @Riverpod(keepAlive: true) -Future fetchAnimeSourcesList( +Future fetchItemSourcesList( Ref ref, { int? id, required bool reFresh, + required ItemType itemType, }) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { - final repos = ref.watch(extensionsRepoStateProvider(ItemType.anime)); + final repos = ref.watch(extensionsRepoStateProvider(itemType)); for (Repo repo in repos) { await fetchSourcesList( repo: repo, refresh: reFresh, id: id, ref: ref, - itemType: ItemType.anime, + itemType: itemType, ); } } diff --git a/lib/services/fetch_anime_sources.g.dart b/lib/services/fetch_item_sources.g.dart similarity index 55% rename from lib/services/fetch_anime_sources.g.dart rename to lib/services/fetch_item_sources.g.dart index 4fdc720f..e39993b3 100644 --- a/lib/services/fetch_anime_sources.g.dart +++ b/lib/services/fetch_item_sources.g.dart @@ -1,13 +1,13 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'fetch_anime_sources.dart'; +part of 'fetch_item_sources.dart'; // ************************************************************************** // RiverpodGenerator // ************************************************************************** -String _$fetchAnimeSourcesListHash() => - r'e7f673d37239c74f3403de3a234bbc1d6e171332'; +String _$fetchItemSourcesListHash() => + r'16238be20517fddacf52a2694fbd50cafbfa7496'; /// Copied from Dart SDK class _SystemHash { @@ -30,33 +30,36 @@ class _SystemHash { } } -/// See also [fetchAnimeSourcesList]. -@ProviderFor(fetchAnimeSourcesList) -const fetchAnimeSourcesListProvider = FetchAnimeSourcesListFamily(); +/// See also [fetchItemSourcesList]. +@ProviderFor(fetchItemSourcesList) +const fetchItemSourcesListProvider = FetchItemSourcesListFamily(); -/// See also [fetchAnimeSourcesList]. -class FetchAnimeSourcesListFamily extends Family> { - /// See also [fetchAnimeSourcesList]. - const FetchAnimeSourcesListFamily(); +/// See also [fetchItemSourcesList]. +class FetchItemSourcesListFamily extends Family> { + /// See also [fetchItemSourcesList]. + const FetchItemSourcesListFamily(); - /// See also [fetchAnimeSourcesList]. - FetchAnimeSourcesListProvider call({ + /// See also [fetchItemSourcesList]. + FetchItemSourcesListProvider call({ int? id, required bool reFresh, + required ItemType itemType, }) { - return FetchAnimeSourcesListProvider( + return FetchItemSourcesListProvider( id: id, reFresh: reFresh, + itemType: itemType, ); } @override - FetchAnimeSourcesListProvider getProviderOverride( - covariant FetchAnimeSourcesListProvider provider, + FetchItemSourcesListProvider getProviderOverride( + covariant FetchItemSourcesListProvider provider, ) { return call( id: provider.id, reFresh: provider.reFresh, + itemType: provider.itemType, ); } @@ -72,35 +75,38 @@ class FetchAnimeSourcesListFamily extends Family> { _allTransitiveDependencies; @override - String? get name => r'fetchAnimeSourcesListProvider'; + String? get name => r'fetchItemSourcesListProvider'; } -/// See also [fetchAnimeSourcesList]. -class FetchAnimeSourcesListProvider extends FutureProvider { - /// See also [fetchAnimeSourcesList]. - FetchAnimeSourcesListProvider({ +/// See also [fetchItemSourcesList]. +class FetchItemSourcesListProvider extends FutureProvider { + /// See also [fetchItemSourcesList]. + FetchItemSourcesListProvider({ int? id, required bool reFresh, + required ItemType itemType, }) : this._internal( - (ref) => fetchAnimeSourcesList( - ref as FetchAnimeSourcesListRef, + (ref) => fetchItemSourcesList( + ref as FetchItemSourcesListRef, id: id, reFresh: reFresh, + itemType: itemType, ), - from: fetchAnimeSourcesListProvider, - name: r'fetchAnimeSourcesListProvider', + from: fetchItemSourcesListProvider, + name: r'fetchItemSourcesListProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$fetchAnimeSourcesListHash, - dependencies: FetchAnimeSourcesListFamily._dependencies, + : _$fetchItemSourcesListHash, + dependencies: FetchItemSourcesListFamily._dependencies, allTransitiveDependencies: - FetchAnimeSourcesListFamily._allTransitiveDependencies, + FetchItemSourcesListFamily._allTransitiveDependencies, id: id, reFresh: reFresh, + itemType: itemType, ); - FetchAnimeSourcesListProvider._internal( + FetchItemSourcesListProvider._internal( super._createNotifier, { required super.name, required super.dependencies, @@ -109,19 +115,21 @@ class FetchAnimeSourcesListProvider extends FutureProvider { required super.from, required this.id, required this.reFresh, + required this.itemType, }) : super.internal(); final int? id; final bool reFresh; + final ItemType itemType; @override Override overrideWith( - FutureOr Function(FetchAnimeSourcesListRef provider) create, + FutureOr Function(FetchItemSourcesListRef provider) create, ) { return ProviderOverride( origin: this, - override: FetchAnimeSourcesListProvider._internal( - (ref) => create(ref as FetchAnimeSourcesListRef), + override: FetchItemSourcesListProvider._internal( + (ref) => create(ref as FetchItemSourcesListRef), from: from, name: null, dependencies: null, @@ -129,20 +137,22 @@ class FetchAnimeSourcesListProvider extends FutureProvider { debugGetCreateSourceHash: null, id: id, reFresh: reFresh, + itemType: itemType, ), ); } @override FutureProviderElement createElement() { - return _FetchAnimeSourcesListProviderElement(this); + return _FetchItemSourcesListProviderElement(this); } @override bool operator ==(Object other) { - return other is FetchAnimeSourcesListProvider && + return other is FetchItemSourcesListProvider && other.id == id && - other.reFresh == reFresh; + other.reFresh == reFresh && + other.itemType == itemType; } @override @@ -150,6 +160,7 @@ class FetchAnimeSourcesListProvider extends FutureProvider { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, id.hashCode); hash = _SystemHash.combine(hash, reFresh.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -157,22 +168,27 @@ class FetchAnimeSourcesListProvider extends FutureProvider { @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -mixin FetchAnimeSourcesListRef on FutureProviderRef { +mixin FetchItemSourcesListRef on FutureProviderRef { /// The parameter `id` of this provider. int? get id; /// The parameter `reFresh` of this provider. bool get reFresh; + + /// The parameter `itemType` of this provider. + ItemType get itemType; } -class _FetchAnimeSourcesListProviderElement extends FutureProviderElement - with FetchAnimeSourcesListRef { - _FetchAnimeSourcesListProviderElement(super.provider); +class _FetchItemSourcesListProviderElement extends FutureProviderElement + with FetchItemSourcesListRef { + _FetchItemSourcesListProviderElement(super.provider); @override - int? get id => (origin as FetchAnimeSourcesListProvider).id; + int? get id => (origin as FetchItemSourcesListProvider).id; @override - bool get reFresh => (origin as FetchAnimeSourcesListProvider).reFresh; + bool get reFresh => (origin as FetchItemSourcesListProvider).reFresh; + @override + ItemType get itemType => (origin as FetchItemSourcesListProvider).itemType; } // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/services/fetch_manga_sources.dart b/lib/services/fetch_manga_sources.dart deleted file mode 100644 index 09fefb0c..00000000 --- a/lib/services/fetch_manga_sources.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/models/settings.dart'; -import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; -import 'package:mangayomi/services/fetch_sources_list.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -part 'fetch_manga_sources.g.dart'; - -@Riverpod(keepAlive: true) -Future fetchMangaSourcesList(Ref ref, {int? id, required reFresh}) async { - if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { - final repos = ref.watch(extensionsRepoStateProvider(ItemType.manga)); - for (Repo repo in repos) { - await fetchSourcesList( - repo: repo, - refresh: reFresh, - id: id, - ref: ref, - itemType: ItemType.manga, - ); - } - } -} diff --git a/lib/services/fetch_manga_sources.g.dart b/lib/services/fetch_manga_sources.g.dart deleted file mode 100644 index c2cd9a9d..00000000 --- a/lib/services/fetch_manga_sources.g.dart +++ /dev/null @@ -1,178 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'fetch_manga_sources.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$fetchMangaSourcesListHash() => - r'176206caf5c51a94b100866d5cdb612d2a5c2fb7'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -/// See also [fetchMangaSourcesList]. -@ProviderFor(fetchMangaSourcesList) -const fetchMangaSourcesListProvider = FetchMangaSourcesListFamily(); - -/// See also [fetchMangaSourcesList]. -class FetchMangaSourcesListFamily extends Family> { - /// See also [fetchMangaSourcesList]. - const FetchMangaSourcesListFamily(); - - /// See also [fetchMangaSourcesList]. - FetchMangaSourcesListProvider call({ - int? id, - required dynamic reFresh, - }) { - return FetchMangaSourcesListProvider( - id: id, - reFresh: reFresh, - ); - } - - @override - FetchMangaSourcesListProvider getProviderOverride( - covariant FetchMangaSourcesListProvider provider, - ) { - return call( - id: provider.id, - reFresh: provider.reFresh, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'fetchMangaSourcesListProvider'; -} - -/// See also [fetchMangaSourcesList]. -class FetchMangaSourcesListProvider extends FutureProvider { - /// See also [fetchMangaSourcesList]. - FetchMangaSourcesListProvider({ - int? id, - required dynamic reFresh, - }) : this._internal( - (ref) => fetchMangaSourcesList( - ref as FetchMangaSourcesListRef, - id: id, - reFresh: reFresh, - ), - from: fetchMangaSourcesListProvider, - name: r'fetchMangaSourcesListProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$fetchMangaSourcesListHash, - dependencies: FetchMangaSourcesListFamily._dependencies, - allTransitiveDependencies: - FetchMangaSourcesListFamily._allTransitiveDependencies, - id: id, - reFresh: reFresh, - ); - - FetchMangaSourcesListProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.id, - required this.reFresh, - }) : super.internal(); - - final int? id; - final dynamic reFresh; - - @override - Override overrideWith( - FutureOr Function(FetchMangaSourcesListRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: FetchMangaSourcesListProvider._internal( - (ref) => create(ref as FetchMangaSourcesListRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - id: id, - reFresh: reFresh, - ), - ); - } - - @override - FutureProviderElement createElement() { - return _FetchMangaSourcesListProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is FetchMangaSourcesListProvider && - other.id == id && - other.reFresh == reFresh; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, id.hashCode); - hash = _SystemHash.combine(hash, reFresh.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin FetchMangaSourcesListRef on FutureProviderRef { - /// The parameter `id` of this provider. - int? get id; - - /// The parameter `reFresh` of this provider. - dynamic get reFresh; -} - -class _FetchMangaSourcesListProviderElement extends FutureProviderElement - with FetchMangaSourcesListRef { - _FetchMangaSourcesListProviderElement(super.provider); - - @override - int? get id => (origin as FetchMangaSourcesListProvider).id; - @override - dynamic get reFresh => (origin as FetchMangaSourcesListProvider).reFresh; -} -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart deleted file mode 100644 index 647063bc..00000000 --- a/lib/services/fetch_novel_sources.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/models/settings.dart'; -import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; -import 'package:mangayomi/services/fetch_sources_list.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -part 'fetch_novel_sources.g.dart'; - -@Riverpod(keepAlive: true) -Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { - if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { - final repos = ref.watch(extensionsRepoStateProvider(ItemType.novel)); - for (Repo repo in repos) { - await fetchSourcesList( - repo: repo, - refresh: reFresh, - id: id, - ref: ref, - itemType: ItemType.novel, - ); - } - } -} diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart deleted file mode 100644 index 9e1c0801..00000000 --- a/lib/services/fetch_novel_sources.g.dart +++ /dev/null @@ -1,178 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'fetch_novel_sources.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$fetchNovelSourcesListHash() => - r'882ee56332290a6fe71d38a8378de847e4386e3a'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -/// See also [fetchNovelSourcesList]. -@ProviderFor(fetchNovelSourcesList) -const fetchNovelSourcesListProvider = FetchNovelSourcesListFamily(); - -/// See also [fetchNovelSourcesList]. -class FetchNovelSourcesListFamily extends Family> { - /// See also [fetchNovelSourcesList]. - const FetchNovelSourcesListFamily(); - - /// See also [fetchNovelSourcesList]. - FetchNovelSourcesListProvider call({ - int? id, - required dynamic reFresh, - }) { - return FetchNovelSourcesListProvider( - id: id, - reFresh: reFresh, - ); - } - - @override - FetchNovelSourcesListProvider getProviderOverride( - covariant FetchNovelSourcesListProvider provider, - ) { - return call( - id: provider.id, - reFresh: provider.reFresh, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'fetchNovelSourcesListProvider'; -} - -/// See also [fetchNovelSourcesList]. -class FetchNovelSourcesListProvider extends FutureProvider { - /// See also [fetchNovelSourcesList]. - FetchNovelSourcesListProvider({ - int? id, - required dynamic reFresh, - }) : this._internal( - (ref) => fetchNovelSourcesList( - ref as FetchNovelSourcesListRef, - id: id, - reFresh: reFresh, - ), - from: fetchNovelSourcesListProvider, - name: r'fetchNovelSourcesListProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$fetchNovelSourcesListHash, - dependencies: FetchNovelSourcesListFamily._dependencies, - allTransitiveDependencies: - FetchNovelSourcesListFamily._allTransitiveDependencies, - id: id, - reFresh: reFresh, - ); - - FetchNovelSourcesListProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.id, - required this.reFresh, - }) : super.internal(); - - final int? id; - final dynamic reFresh; - - @override - Override overrideWith( - FutureOr Function(FetchNovelSourcesListRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: FetchNovelSourcesListProvider._internal( - (ref) => create(ref as FetchNovelSourcesListRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - id: id, - reFresh: reFresh, - ), - ); - } - - @override - FutureProviderElement createElement() { - return _FetchNovelSourcesListProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is FetchNovelSourcesListProvider && - other.id == id && - other.reFresh == reFresh; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, id.hashCode); - hash = _SystemHash.combine(hash, reFresh.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin FetchNovelSourcesListRef on FutureProviderRef { - /// The parameter `id` of this provider. - int? get id; - - /// The parameter `reFresh` of this provider. - dynamic get reFresh; -} - -class _FetchNovelSourcesListProviderElement extends FutureProviderElement - with FetchNovelSourcesListRef { - _FetchNovelSourcesListProviderElement(super.provider); - - @override - int? get id => (origin as FetchNovelSourcesListProvider).id; - @override - dynamic get reFresh => (origin as FetchNovelSourcesListProvider).reFresh; -} -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package