mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-01-11 22:40:36 +00:00
Merge pull request #484 from NBA2K1/main
Fixes, Refactors, and Async Improvements
This commit is contained in:
commit
183e88ebd0
11 changed files with 148 additions and 566 deletions
|
|
@ -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<ExtensionScreen> {
|
|||
final ScrollController controller = ScrollController();
|
||||
bool isUpdating = false;
|
||||
Future<void> _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<void> _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),
|
||||
|
|
|
|||
|
|
@ -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,28 +42,14 @@ class _ExtensionListTileWidgetState
|
|||
setState(() => _isLoading = true);
|
||||
|
||||
try {
|
||||
final future = switch (widget.source.itemType) {
|
||||
ItemType.manga => ref.watch(
|
||||
fetchMangaSourcesListProvider(
|
||||
id: widget.source.id,
|
||||
reFresh: true,
|
||||
).future,
|
||||
),
|
||||
ItemType.anime => ref.watch(
|
||||
fetchAnimeSourcesListProvider(
|
||||
id: widget.source.id,
|
||||
reFresh: true,
|
||||
).future,
|
||||
),
|
||||
_ => ref.watch(
|
||||
fetchNovelSourcesListProvider(
|
||||
id: widget.source.id,
|
||||
reFresh: true,
|
||||
).future,
|
||||
),
|
||||
};
|
||||
final provider = fetchItemSourcesListProvider(
|
||||
id: widget.source.id,
|
||||
reFresh: true,
|
||||
itemType: widget.source.itemType,
|
||||
);
|
||||
|
||||
await future;
|
||||
if (!widget.source.isAdded!) ref.invalidate(provider);
|
||||
await ref.watch(provider.future);
|
||||
} finally {
|
||||
if (mounted) setState(() => _isLoading = false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<MainScreen> {
|
|||
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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 (_) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<void> fetchAnimeSourcesList(
|
||||
Future<void> 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<AsyncValue<void>> {
|
||||
/// See also [fetchAnimeSourcesList].
|
||||
const FetchAnimeSourcesListFamily();
|
||||
/// See also [fetchItemSourcesList].
|
||||
class FetchItemSourcesListFamily extends Family<AsyncValue<void>> {
|
||||
/// 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<AsyncValue<void>> {
|
|||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'fetchAnimeSourcesListProvider';
|
||||
String? get name => r'fetchItemSourcesListProvider';
|
||||
}
|
||||
|
||||
/// See also [fetchAnimeSourcesList].
|
||||
class FetchAnimeSourcesListProvider extends FutureProvider<void> {
|
||||
/// See also [fetchAnimeSourcesList].
|
||||
FetchAnimeSourcesListProvider({
|
||||
/// See also [fetchItemSourcesList].
|
||||
class FetchItemSourcesListProvider extends FutureProvider<void> {
|
||||
/// 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<void> {
|
|||
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<void> Function(FetchAnimeSourcesListRef provider) create,
|
||||
FutureOr<void> 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<void> {
|
|||
debugGetCreateSourceHash: null,
|
||||
id: id,
|
||||
reFresh: reFresh,
|
||||
itemType: itemType,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
FutureProviderElement<void> 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<void> {
|
|||
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<void> {
|
|||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin FetchAnimeSourcesListRef on FutureProviderRef<void> {
|
||||
mixin FetchItemSourcesListRef on FutureProviderRef<void> {
|
||||
/// 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<void>
|
||||
with FetchAnimeSourcesListRef {
|
||||
_FetchAnimeSourcesListProviderElement(super.provider);
|
||||
class _FetchItemSourcesListProviderElement extends FutureProviderElement<void>
|
||||
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
|
||||
|
|
@ -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<void> 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<AsyncValue<void>> {
|
||||
/// 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<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'fetchMangaSourcesListProvider';
|
||||
}
|
||||
|
||||
/// See also [fetchMangaSourcesList].
|
||||
class FetchMangaSourcesListProvider extends FutureProvider<void> {
|
||||
/// 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<void> 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<void> 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<void> {
|
||||
/// The parameter `id` of this provider.
|
||||
int? get id;
|
||||
|
||||
/// The parameter `reFresh` of this provider.
|
||||
dynamic get reFresh;
|
||||
}
|
||||
|
||||
class _FetchMangaSourcesListProviderElement extends FutureProviderElement<void>
|
||||
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
|
||||
|
|
@ -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<void> 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<AsyncValue<void>> {
|
||||
/// 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<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'fetchNovelSourcesListProvider';
|
||||
}
|
||||
|
||||
/// See also [fetchNovelSourcesList].
|
||||
class FetchNovelSourcesListProvider extends FutureProvider<void> {
|
||||
/// 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<void> 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<void> 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<void> {
|
||||
/// The parameter `id` of this provider.
|
||||
int? get id;
|
||||
|
||||
/// The parameter `reFresh` of this provider.
|
||||
dynamic get reFresh;
|
||||
}
|
||||
|
||||
class _FetchNovelSourcesListProviderElement extends FutureProviderElement<void>
|
||||
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
|
||||
|
|
@ -36,35 +36,34 @@ Future<void> fetchSourcesList({
|
|||
)
|
||||
.toList();
|
||||
|
||||
isar.writeTxnSync(() async {
|
||||
if (id != null) {
|
||||
final matchingSource = sourceList.firstWhere(
|
||||
(source) => source.id == id,
|
||||
orElse: () => Source(),
|
||||
);
|
||||
if (matchingSource.id != null) {
|
||||
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);
|
||||
}
|
||||
|
|
@ -108,9 +107,7 @@ Future<void> _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(
|
||||
|
|
@ -121,7 +118,12 @@ Future<void> _updateSource(
|
|||
);
|
||||
}
|
||||
|
||||
void _addNewSource(Source source, Ref ref, Repo? repo, ItemType itemType) {
|
||||
Future<void> _addNewSource(
|
||||
Source source,
|
||||
Ref ref,
|
||||
Repo? repo,
|
||||
ItemType itemType,
|
||||
) async {
|
||||
final newSource = Source()
|
||||
..sourceCodeUrl = source.sourceCodeUrl
|
||||
..id = source.id
|
||||
|
|
@ -145,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<void> checkIfSourceIsObsolete(
|
||||
List<Source> 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;
|
||||
|
||||
|
|
@ -176,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) &&
|
||||
|
|
@ -184,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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue